Файлові потоки. Відкриття та закриття
Для роботи з файлами в стандартній бібліотеці визначено заголовний файл fstream , який визначає базові типи для читання та запису файлів. Зокрема, це:
ifstream // : для читання з файлу ofstream // : для запису у файл fstream // : поєднує запис та читання
Для роботи з даними типу wchar_t для цих потоків визначено двійники:
wifstream wofstream wfstream
Відкриття файлу
При операціях із файлом спочатку необхідно відкрити файл за допомогою функції open() . Ця функція має дві версії:
open( шлях до файла )
open(шлях до файла , режим відкриття файла)
Щоб відкрити файл у функцію, необхідно передати шлях до файлу у вигляді рядка. Також можна вказати режим відкриття. Список доступних режимів відкриття файлу:
: файл відкривається для введення (читання). Може бути встановлений тільки для об'єкта ifstream або fstream
: файл відкривається для виведення (запису). При цьому старі дані видаляються. Може бути встановлений тільки для об'єкта ofstream або fstream
: файл відкривається для запису. Старі дані не видаляються.
: після відкриття файлу переміщує покажчик у кінець файлу
: файл усікається під час відкриття. Можливо, якщо також встановлено режим out
: файл відкривається у бінарному режимі
Якщо при відкритті режим не вказано, то за умовчанням для об'єктів застосовується режим , а для об'єктів - режим . Для об'єктів fstream поєднуються режими ios::outта ios::in.
std::ofstream out; // потік для запису
out.open("output.txt"); // відкриваємо файл для запису
std::ofstream out2;
out2.open("output1.txt", std::ios::app); // відкриваємо файл для дозапису
std::ofstream out3;
out2.open("file.txt", std::ios::out | std::ios::trunc); // встановлюємо декілька режимів
std::ifstream in; // потік для читання
in.open("input.txt"); // відкриваємо файл для читання
std::fstream fs; // потік для читання-запису
fs.open("in-out.txt"); // відкриваємо файл для чтитання-записуФункцію open для відкриття файлу необов'язково використовувати. В якості альтернативи можна також використовувати конструктор об'єктів-потоків та передавати в них шлях до файлу та режим відкриття:
$fstream( шлях, режим відкриття файла)
При виклику конструктора, який передано шлях до файлу, цей файл буде автоматично відкриватися:
std::ofstream out("output.txt");
std::ifstream in("input.txt");
std::fstream fs("in-out-put.txt", std::ios::app);У цьому випадку передбачається, що файл *.txt" розташовується в тій же папці, де файл програми.
Взагалі використання конструкторів для відкриття потоку є кращим, оскільки визначення змінної, що представляє файловий потік, вже припускає, що цей потік буде відкритий для читання або запису. А використання конструктора позбавить ситуації, коли ми забудемо відкрити потік, але при цьому почнемо його використовувати.
У процесі роботи ми можемо перевірити, чи файл за допомогою функції is_open() . Якщо файл відкритий, вона повертає true:
std::ifstream in; // потік для читання
in.open("hello.txt"); // відкриваємо файл для читання
// якщо файл відкрито
if (in.is_open())
{
}Закриття файлу
Після завершення роботи з файлом слід закрити за допомогою функції close() . Також варто відзначити, що при виході об'єкта потоку з області видимості він видаляється, і у нього автоматично викликається функція close.
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream out; // потік для запису
out.open("input.txt"); // відкриваємо файл для запису
out.close(); // закрываємо файл
ifstream in; // потік для читання
in.open("output.txt"); // відкриваємо файл для читання
in.close(); // закриваєм файл
fstream fs; // потік для читання-запису
fs.open("in-out.txt"); // відкриваємо файл для читання-запису
fs.close(); // закриваємо файл
}